package com.zxl.grocery.microservice.common.util.jwt;

import com.zxl.grocery.microservice.common.constants.CommonConstants;
import com.zxl.grocery.microservice.common.util.RsaKeyHelper;
import com.zxl.grocery.microservice.common.util.StringHelper;
import io.jsonwebtoken.*;
import org.joda.time.DateTime;

/**
 * @Author: zxl
 * @Description: jwt工具类  将异常全部抛出去
 * @Date: Created in 17:19 2017/10/12
 * @Modified By:
 */
public class JWTHelper {
    private static RsaKeyHelper rsaKeyHelper = new RsaKeyHelper();
    /**
     * 密钥加密 生成token
     *
     * @param jwtInfo 需要放入jwt用户信息的对象
     * @param priKeyPath 秘钥路径
     * @param expire 失效时间 单位：秒
     * @return
     * @throws Exception
     */
    public static String generateToken(IJWTInfo jwtInfo, String priKeyPath, int expire) throws Exception {
//        生成对应json web token
        String compactJws = Jwts.builder()
                .setSubject(jwtInfo.getUniqueName())//设置用户登录名
//                可以有很多个claim,来存放自定义的信息
                .claim(CommonConstants.JWT_KEY_USER_ID, jwtInfo.getId())//放入用户id
                .claim(CommonConstants.JWT_KEY_NAME, jwtInfo.getName())//放入用户名
                .setExpiration(DateTime.now().plusSeconds(expire).toDate())//设置过期时间
                .signWith(SignatureAlgorithm.RS256, rsaKeyHelper.getPrivateKey(priKeyPath))//使用秘钥加密token
                .compact();
        return compactJws;
    }

    /**
     * 公钥解析token
     *
     * @param token
     * @param pubKeyPath 公钥路径
     * @return
     * @throws Exception
     */
    public static Jws<Claims> parserToken(String token, String pubKeyPath) throws Exception {
//        try {
//            通过反转，验证token是否符合
            Jws<Claims> claimsJws = Jwts.parser().setSigningKey(rsaKeyHelper.getPublicKey(pubKeyPath)).parseClaimsJws(token);
            return claimsJws;
//        } catch (SignatureException e){
//            可以打印一个token解析失败的logger
//            return null;
//        }
    }

    /**
     * 获取token中的存放的信息
     *
     * @param token
     * @param pubKeyPath 公钥路径
     * @return
     * @throws Exception
     */
    public static IJWTInfo getInfoFromToken(String token, String pubKeyPath) throws Exception {
        Jws<Claims> claimsJws = parserToken(token, pubKeyPath);
//        if(claimsJws == null){
//            打印日志，没有获取到用户信息
//            return null;
//        }
        Claims body = claimsJws.getBody();
        return new JWTInfo(body.getSubject(), StringHelper.getObjectValue(body.get(CommonConstants.JWT_KEY_USER_ID)), StringHelper.getObjectValue(body.get(CommonConstants.JWT_KEY_NAME)));
    }

}
